#include "../include/FileManager.h"
#include <direct.h> // 用于创建目录
#include <iostream>

// 构造函数实现
FileManager::FileManager(const std::string& studentFile, const std::string& courseFile, 
                         const std::string& selectionFile)
    : studentFile(studentFile), courseFile(courseFile), selectionFile(selectionFile) {}

// 创建目录方法实现
bool FileManager::createDirectories() {
    // 创建data目录
    if (_mkdir("data") != 0 && errno != EEXIST) {
        std::cerr << "无法创建data目录" << std::endl;
        return false;
    }
    return true;
}

// 保存数据的模板方法实现
template<typename T>
bool FileManager::saveData(const std::vector<T>& data, const std::string& filename) {
    std::ofstream file(filename, std::ios::binary);
    if (!file) {
        std::cerr << "无法打开文件: " << filename << std::endl;
        return false;
    }
    
    // 写入数据数量
    size_t size = data.size();
    file.write(reinterpret_cast<const char*>(&size), sizeof(size));
    
    // 写入每个对象
    for (const auto& item : data) {
        file << item << std::endl;
    }
    
    return true;
}

// 加载数据的模板方法实现
template<typename T>
bool FileManager::loadData(std::vector<T>& data, const std::string& filename) {
    std::ifstream file(filename, std::ios::binary);
    if (!file) {
        // 文件不存在，返回true但不加载数据
        return true;
    }
    
    // 读取数据数量
    size_t size;
    file.read(reinterpret_cast<char*>(&size), sizeof(size));
    
    // 读取每个对象
    data.clear();
    for (size_t i = 0; i < size; ++i) {
        T item;
        file >> item;
        data.push_back(item);
    }
    
    return true;
}

// 保存学生数据方法实现
bool FileManager::saveStudents(const std::vector<Student>& students) {
    return saveData(students, studentFile);
}

// 保存课程数据方法实现
bool FileManager::saveCourses(const std::vector<Course>& courses) {
    return saveData(courses, courseFile);
}

// 保存选课数据方法实现
bool FileManager::saveSelections(const std::vector<CourseSelection>& selections) {
    return saveData(selections, selectionFile);
}

// 加载学生数据方法实现
bool FileManager::loadStudents(std::vector<Student>& students) {
    return loadData(students, studentFile);
}

// 加载课程数据方法实现
bool FileManager::loadCourses(std::vector<Course>& courses) {
    return loadData(courses, courseFile);
}

// 加载选课数据方法实现
bool FileManager::loadSelections(std::vector<CourseSelection>& selections) {
    return loadData(selections, selectionFile);
}

// 模板实例化
template bool FileManager::saveData<Student>(const std::vector<Student>&, const std::string&);
template bool FileManager::saveData<Course>(const std::vector<Course>&, const std::string&);
template bool FileManager::saveData<CourseSelection>(const std::vector<CourseSelection>&, const std::string&);
template bool FileManager::loadData<Student>(std::vector<Student>&, const std::string&);
template bool FileManager::loadData<Course>(std::vector<Course>&, const std::string&);
template bool FileManager::loadData<CourseSelection>(std::vector<CourseSelection>&, const std::string&);